﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace PROJECT_BOMBER.BLL
{
    // ===============================================================================================
    /// Game State Stack
    // ===============================================================================================
    public class GameStateStack
    {
        private GameState _pauseState;


        // ===============================================================================================
        /// Remplace l'état courant par un nouvel état. 
        /// S'il y a plusieurs états dans la stack, on les supprime tous
        // ===============================================================================================
        public void Set(GameState state)
        {
            while (States.Count > 0)
            {
                Pop();
            }

            Add(state);
        }

        public void Pause(GameState state, GameState play)
        {
            _pauseState = play;
            Set(state);
        }

        public void Continue()
        {
            while (States.Count > 0)
            {
                Pop();
            }

            States.Push(_pauseState);
        }

        // ===============================================================================================
        /// Initialize un état puis l'ajoute à la stack
        // ===============================================================================================
        public void Add(GameState state)
        {
            state.Initialize();
            state.Load();
            States.Push(state);
        }

        // ===============================================================================================
        /// Supprime l'état courant de la stack
        // ===============================================================================================
        public void Pop()
        {
            if (States.Count > 0)
            {
                States.Peek().Destroy();
                States.Pop();
            }
        }

        // ===============================================================================================
        /// Met à jour l'état courant
        // ===============================================================================================
        public void Update(float deltatime)
        {
            if (States.Count > 0)
            {
                States.Peek().Update(deltatime);
            }
        }

        // ===============================================================================================
        /// Affiche l'état courant
        // ===============================================================================================
        public void Draw()
        {
            if (States.Count > 0)
            {
                States.Peek().Draw();
            }
        }

        public void Load()
        {
            if (States.Count > 0)
            {
                States.Peek().Load();
            }
        }

        public void Unload()
        {
            if (States.Count > 0)
            {
                States.Peek().Unload();
            }
        }

        // ===============================================================================================
        /// Stack de Game States
        // ===============================================================================================
        public Stack<GameState> States = new Stack<GameState>();
    }
}
